﻿// -------------------------------------------------------------------------
//    @FileName         :    NFLoginModule.h
//    @Author           :    gaoyi
//    @Date             :    24-8-13
//    @Email            :    445267987@qq.com
//    @Module           :    NFLoginModule
//
// -------------------------------------------------------------------------

#pragma once

#include "NFComm/NFCore/NFPlatform.h"
#include "NFLogicCommon/NFMMODynamicModule.h"
#include "NFLogicDynamicModule.h"
#include "proto_common_base.pb.h"

namespace proto_ff
{
    class Proto_CSLoginReq;
}

struct VersionDesc;

class NFLoginModule final : public NFLogicDynamicModule
{
public:
    explicit NFLoginModule(NFIPluginManager* p);

    ~NFLoginModule() override;

public:
    // 虚函数，用于初始化对象
    int Awake() override;

    // 处理客户端消息的虚函数
    // @param packet 消息包，包含客户端发送的数据
    // @param pSession 会话指针，用于识别客户端
    // @param req 解析后的请求消息
    int OnHandleClientMessage(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req) override;

    int OnHandleServerMessage(uint32_t msgId, NFDataPackage& packet, uint64_t param1, uint64_t param2) override;

public:
    // 处理心跳消息的函数
    // 心跳消息用于维持客户端与服务器之间的连接
    // @param packet 消息包，包含客户端发送的数据
    // @param pSession 会话指针，用于识别客户端
    // @param req 解析后的请求消息
    int OnHandleHeartBeat(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    /**
     * @brief 检查并处理登录请求
     *
     * 此函数负责验证客户端的登录请求，包括版本号、登录区域 ID 等校验，并根据校验结果执行相应的处理逻辑。
     * 如果校验通过，还会设置会话的相关状态信息。
     *
     * @param pSession 当前会话对象的指针
     * @param message 客户端发送的登录请求消息
     * @return 0 表示成功，其他值为错误码
     *
     * @note 主要处理逻辑：
     *       1. 检查会话对象是否为空；
     *       2. 校验客户端版本号与资源版本号；
     *       3. 校验登录区域 ID 是否匹配；
     *       4. 根据登录请求设置会话的区域 ID 和招募状态；
     *       5. 判断是否需要排队并处理排队逻辑。
     *
     * @warning 确保会话对象和登录请求消息的有效性，避免空指针或非法数据。
     */
    int CheckAndHandleLogin(NFSession* pSession, const proto_ff::Proto_CSLoginReq& message);

    /**
     * @brief 检查白名单和注册渠道的函数
     *
     * 该函数用于验证客户端的白名单状态和注册渠道是否合法。
     * 根据客户端发送的登录请求消息，执行相关的校验逻辑。
     *
     * @param pSession 指向当前会话对象的指针，用于标识和管理与客户端的会话。
     * @param message 客户端发送的登录请求消息，包含需要校验的白名单和注册渠道信息。
     *
     * @return int 返回处理结果的状态码。通常返回0表示校验通过，非0表示校验失败或错误码。
     *
     * @note
     * - 确保会话对象和登录请求消息的有效性，避免空指针或非法数据。
     * - 校验逻辑可能涉及数据库查询或其他外部资源访问，需注意性能和安全性。
     * - 该函数的实现应遵循安全编码实践，避免信息泄露或被恶意利用。
     */
    int CheckWhiteAndRegChannel(NFSession* pSession, const proto_ff::Proto_CSLoginReq& message);

    /**
     * @brief 处理客户端登录请求的函数
     *
     * 此函数负责处理客户端发送的登录请求消息，执行一系列校验和逻辑处理，
     * 包括检查登录信息的合法性、白名单和注册渠道的校验，以及角色列表的获取。
     *
     * @param packet 包含客户端发送的登录请求数据包
     * @param pSession 当前会话对象的指针，用于标识和管理与客户端的会话
     * @param req 客户端发送的请求消息，包含登录请求的具体内容
     *
     * @return int 返回处理结果的状态码。通常返回0表示处理成功，非0表示处理失败或错误码
     *
     * @note
     * - 确保会话对象和请求消息的有效性，避免空指针或非法数据。
     * - 校验逻辑包括登录信息的合法性检查和白名单/注册渠道的校验。
     * - 如果校验通过，将初始化并处理角色列表的获取事务。
     * - 该函数的实现应遵循安全编码实践，避免信息泄露或被恶意利用。
     */
    int OnHandleAccLogin(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    /**
     * 处理创建角色请求的函数
     *
     * 该函数用于处理客户端发送的创建角色请求，解析请求数据，进行角色创建逻辑处理，并返回处理结果给客户端
     *
     * @param packet  包含请求数据的数据包
     * @param pSession  指向会话对象的指针，用于识别和管理与客户端的会话
     * @param req  请求数据的具体内容，遵循proto_ff协议定义的Proto_CSReq结构
     * @return 返回处理结果的整数值，具体的返回值含义和处理逻辑可以在函数内部定义
     */
    int OnHandleCreateRoleReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    // 处理删除角色请求的函数
    // 该函数负责解析和处理来自客户端的删除角色请求，验证用户权限并执行相应的逻辑处理
    // 参数:
    //   packet: 数据包，包含客户端请求的数据
    //   pSession: 会话指针，用于标识和管理与客户端的连接会话
    //   req: 删除角色的请求对象，包含客户端传递的所有必要信息
    // 返回值:
    //   int: 表示处理结果的状态码，成功或失败的标识
    int OnHandleDeleteRoleReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    /**
     * 处理客户端发送的设置时钟请求
     *
     * @param packet 包含请求数据的数据包
     * @param pSession 指向会话对象的指针
     * @param pstCsMsgReq 请求数据的具体内容
     * @return 处理结果
     */
    int OnHandleRttSetClockReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& pstCsMsgReq);

    /**
     * 处理日志检查点请求
     *
     * 此函数负责处理与日志检查点相关的请求，通过分析客户端发送的数据包和会话信息，
     * 解析特定的请求协议，并根据这些信息执行相应的处理逻辑
     *
     * @param packet 包含从客户端接收到的数据包，用于提取处理所需的数据
     * @param pSession 指向会话的指针，用于管理与客户端的会话状态
     * @param req 对于特定的请求协议的引用，包含客户端发送的具体请求数据
     * @return 返回处理的结果，通常表示处理是否成功
     */
    int OnHandleLogCheckPointReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    /**
     * 处理列队取消请求
     *
     * 此函数用于处理客户端发送的取消列队请求，通过分析数据包和会话信息，
     * 解析特定的请求协议，并根据这些信息执行取消列队的逻辑
     *
     * @param packet 包含从客户端接收到的数据包，用于提取处理所需的数据
     * @param pSession 指向会话的指针，用于管理与客户端的会话状态
     * @param req 对于特定的请求协议的引用，包含客户端发送的具体请求数据
     * @return 返回处理的结果，通常表示处理是否成功
     */
    int OnHandleLineUpCancelReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    // 处理获取角色请求的函数
    // 这个函数的主要作用是解析并处理来自客户端的获取角色请求
    int OnHandleRoleLoginReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    int OnHandleFanTypeReportReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    /**
     * @brief 处理新手引导获取请求的函数
     *
     * 该函数用于处理客户端发送的新手引导获取请求，根据请求内容进行相应的处理，并返回处理结果。
     *
     * @param packet 包含请求数据的包，类型为NFDataPackage，用于传递和处理网络数据包。
     * @param pSession 当前会话的指针，类型为NFSession，用于标识和处理当前会话的相关信息。
     * @param req 客户端发送的请求数据，类型为proto_ff::Proto_CSReq，包含请求的具体内容。
     *
     * @return int 返回处理结果，通常为0表示成功，非0表示失败或错误码。
     */
    int OnHandleNoviceGuideGetReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    /**
     * @brief 处理新手引导设置请求的函数
     *
     * 该函数用于处理客户端发送的新手引导设置请求。根据请求内容，更新服务器端的新手引导状态，
     * 并可能触发相关的事件或逻辑。
     *
     * @param packet 数据包对象，包含客户端发送的原始数据包信息。
     * @param pSession 会话对象，表示当前客户端与服务器之间的会话。
     * @param req 请求对象，包含客户端发送的新手引导设置请求的具体内容。
     *
     * @return int 返回处理结果的状态码。通常返回0表示成功，非0表示失败或错误。
     */
    int OnHandleNoviceGuideSetReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

    /**
     * @brief 处理状态离开请求的函数
     *
     * 该函数用于处理客户端发送的状态离开请求。根据请求内容，执行相应的逻辑处理，
     * 并返回处理结果。
     *
     * @param packet 数据包对象，包含请求的相关数据信息。
     * @param pSession 会话对象指针，表示当前请求的会话上下文。
     * @param req 请求消息对象，包含客户端发送的具体请求内容。
     *
     * @return int 返回处理结果，通常为错误码或状态码。0表示成功，非0表示失败。
     */
    int OnHandleStateLeaveReq(NFDataPackage& packet, NFSession* pSession, const proto_ff::Proto_CSReq& req);

public:
    /**
     * 检查客户端版本是否符合要求
     *
     * 本函数的主要作用是根据客户端的平台类型，检查客户端版本是否符合要求。当客户端版本不符合要求时，应进行相应的处理。
     *
     * @param ePlatType 客户端的平台类型，如安卓、iOS等
     * @param strClientVersion 客户端的版本号
     * @param strResVersion 期望的客户端版本号，即符合要求的版本号
     * @return 返回一个整数值，表示检查的结果。具体的返回值含义和使用方式由具体实现决定。
     *
     */
    int CheckClientVersion(proto_ff::Proto_PlatType ePlatType, std::string strClientVersion, std::string strResVersion) const;

    /**
     * 检查登录区域ID是否有效
     *
     * @param iLoginZoneId 登录区域ID，用于判断用户是否可以登录到该区域
     * @return 返回一个整数值，表示检查的结果。具体的返回值含义由具体实现决定。
     *
     * 注意：这个函数的实现可能涉及到安全或权限验证的逻辑，因此在修改或使用时需要谨慎。
     */
    int CheckLoginZoneId(int iLoginZoneId) const;

public:
    // 比较两个版本的函数
    // 该函数接受两个版本描述符作为参数，并返回它们的版本比较结果
    // 参数:
    //   stLeftVer: 左侧版本描述符
    //   stRightVer: 右侧版本描述符
    // 返回值:
    //   如果左侧版本大于右侧版本，返回1
    //   如果左侧版本等于右侧版本，返回0
    //   如果左侧版本小于右侧版本，返回-1
    static int CompareVersion(const VersionDesc& stLeftVer, const VersionDesc& stRightVer);

    // 创建名称错误的静态函数
    // 该函数用于在会话中创建一个名称错误，并返回错误代码
    // 参数:
    //   pSession: 指向NFSession对象的指针
    //   errCode: 错误代码
    // 返回值:
    //   返回创建的名称错误的错误代码
    static int CreateRoleError(NFSession* pSession, int errCode);

public:
    static int OnHandleRoleLoginNtf(uint32_t msgId, NFDataPackage& packet, uint64_t param1, uint64_t param2);
};
